结构

  在一个要介绍的变量类型是结构( struct,structure的缩写 )。结构就是由几个数据组成的数据结构,这些数据可能具有不同的类型。根据这个结构,可以定义自己的变量类型。例如,假定要存储从起点开始到某一位置的路径,其中路径由一个方向和一个距离值(英里)组成。为简单起见,假定该方向是指南针上的一点(这样,方向就可以用上一节的 orientation 枚举来表示),距离值可以用一个 double 类型来表示。

  通过前面的代码,可用两个不同的变量来表示该路径:

        orientation myDirection;
        double myDistance;

  像这样使用两个变量,是没有错误的,但在一个地方存储这些信息更加简单(在需要多个路径时,就尤为简单)。

定义结构

  使用 struct 关键字来定义结构,如下所示:

        struct <typeName>
        {
            <memberDeclarations>
        }

  <memberDeclarations> 部分包含变量的声明(称为结构的数据成员),其格式与前面的变量声明一样。每个成员的声明都采用如下形式:

        <accessbility> <type> <name>;

  要让调用结构的代码访问该结构的数据成员,可以对 <accesssibility> 使用关键字 public,例如:

        struct rout
        {
            public orientation direction;
            public double distance;
        }

  定义结构类型后,就可以定义该结构类型的变量:

        rout myRoute;

  还可以通过句点字符访问这个组合变量中的数据成员:


        myRoute.direction = orientation.north;
        myRoute.distance = 2.5;


  把这个类型放在下面的 “试一试”示例中,其中使用上一节的 orientation 枚举和上面的 route 结构。本例在代码中处理这个结构,以便你了解结构的工作原理。

将下列代码添加到 Program.cs 中:


        namespace Ch05Ex03
        {
            enum orientation : byte
            {
                north = 1,
                south = 2,
                east = 3,
                west = 4
            }

            struct route
            {
                public orientation direction;
                public double distance;
            }

            class Program
            {
                static void Main(string[] args)
                {
                    route myRoute;
                    int myDirection = -1;
                    double myDistance;
                    Console.WriteLine("1) North\n2) South\n3) East\n4) West");
                    do
                    {
                        Console.WriteLine("Select a direction");
                        myDirection = Convert.ToInt32(Console.ReadLine());
                    } while ((myDirection < 1) || (myDirection > 4));
                    Console.WriteLine("Input a distance:");
                    myDistance = Convert.ToDouble(Console.ReadLine());
                    myRoute.direction = (orientation)myDirection;
                    myRoute.distance = myDistance;
                    Console.WriteLine("myRoute specifies a direction of {0} and a distance of {1}", 
                                        myRoute.direction, myRoute.distance);
                    Console.ReadKey();
                }
            }
        }

示例的说明

  结构和枚举一样,也是在代码的主体之外声明的。在名称空间声明 route 结构及其使用的 orientation 枚举:

        enum orientation : byte
        {
            north = 1,
            south = 2,
            east = 3,
            west = 4
        }
        struct route
        {
            public orientation direction;
            public double distance;
        }

  代码的主体结构与前面的一些示例类似,要求用户输入一些信息,并显示它们。把方向选择放在 do 循环中,对用户的输入进行有效性的检查,拒绝不属于 1~4 范围的整数输入(选择该范围中的值可以映射到枚举成员,从而方便赋值)。

  不能解释为整数的输入会导致一个错误。本章后面会说明其原因和处理方法。

  注意 ⚠️,在引用 route 的成员时,处理它们的方式与处理和成员类型相同的变量完全一样。赋值语句如下所示:


        myRoute.direction = (orientation)myDirection;
        myRoute.distance = myDistance;

  可直接把输入的值放到 myRoute.distance 中,而不会有负面效果,如下所示:


        myRoute.distance = Convert.ToDouble(Console.ReadLine());

  还应进行有效性验证,但这段代码不存在这一步骤。对结构成员的任何访问都以相同的方式处理。 <structVar>.<memberVar> 形式的表达式可计算 <memberVar> 类型的变量。

🔚